package user

import (
	"net/http"
	"strings"

	"github.com/gin-contrib/sessions"
	"github.com/gin-gonic/gin"
	"github.com/sirupsen/logrus"
	"inspur.com/cloudware/controller"
	"inspur.com/cloudware/model"
	"inspur.com/cloudware/serializer"
	"inspur.com/cloudware/service"
)

// UserRegister 用户注册接口
func UserRegister(c *gin.Context) {
	var service service.UserRegisterService
	//post body映射代码对象
	if err := c.ShouldBind(&service); err == nil {
		res := service.Register()
		c.JSON(200, res)
	} else {
		c.JSON(400, controller.ErrorResponse(err))
	}
}

// UserLogin 用户登录接口
func UserLogin(c *gin.Context) {
	var service service.UserLoginService
	if err := c.ShouldBind(&service); err == nil {
		res := service.JWTLogin(c)
		//顺便清一下过期的token
		model.ClearToken()
		c.JSON(200, res)
	} else {
		c.JSON(400, controller.ErrorResponse(err))
	}
}

// UserMe 用户详情
func UserMe(c *gin.Context) {
	c.JSON(200, gin.H{
		"msg":  "success",
		"data": gin.H{"woshisei": "sheldon", "salary": 800000},
	})
}

// CurrentUser 获取当前用户
func CurrentUser(c *gin.Context) *model.User {
	if user, _ := c.Get("user"); user != nil {
		//类型断言
		if u, ok := user.(*model.User); ok {
			return u
		}
	}
	return nil
}

// UserLogout 用户登出
func UserLogout(c *gin.Context) {
	authHeader := c.Request.Header.Get("Authorization") // 获取请求头中的数据
	if authHeader == "" {
		c.JSON(http.StatusOK, gin.H{
			"code": 2003,
			"msg":  "请求头中auth为空",
		})
		// 不进行下面的请求处理了！
		c.Abort()
		return
	}
	// 按空格分割
	parts := strings.SplitN(authHeader, " ", 2)
	if !(len(parts) == 2 && parts[0] == "Bearer") {
		c.JSON(http.StatusOK, gin.H{
			"code": 2004,
			"msg":  "请求头中auth格式有误",
		})
		// 不进行下面的请求处理了！
		c.Abort()
		return
	}
	// parts[1]是获取到的tokenString
	tokenstring := parts[1]
	// 根据db中的记录，判断是否是一个有效token；注销用户时，从数据库中删除token；
	token_db, err := model.GetToken(tokenstring)
	if err != nil {
		//get 出错  要么not found   要么数据库有问题  打印一下直接忽略
		logrus.Error(err)
	}
	token_db.DeleteToken()
	//顺便清一下过期的token
	model.ClearToken()
	//清理session
	s := sessions.Default(c)
	s.Clear()
	s.Save()
	c.JSON(200, serializer.Response{
		Code: 0,
		Msg:  "登出成功",
	})
}
